#include "doubleLinkList.h"

// 创建一个空链表
LinkList list_Create()
{
    LinkList H = (LinkList)malloc(sizeof(LNode));
    if (H == NULL)
    {
        printf("内存分配失败\n");
    }

    H->next = NULL;
    H->prior = NULL;
    H->data = 0;
    return H;
}
// 获得指定位置的结点
LinkList list_get(LinkList H, int pos)
{
    LinkList p = H->next;
    int i = 1;
    while (p && i < pos)
    {
        p = p->next;
        i++;
    }
    return p;
}
// 判断是否尾空链表
int empty(LinkList H)
{
    if (H->next == NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
// 头插
int list_head_insert(LinkList H, Data_type value)
{
    LinkList newNode = (LinkList)malloc(sizeof(LNode));
    LinkList head = H;
    if (head == NULL)
    {
        printf("空间有问题\n");
    }

    if (newNode == NULL)
    {
        printf("内存分配失败\n");
        return -1;
    }
    // // 设置新节点数据
    newNode->data = value;
    newNode->prior = NULL;
    newNode->next = NULL;
    // // 设置新节点的next指向头结点的下一个结点
    newNode->next = head->next;
    if (head->next != NULL)
    {
        head->next->prior = newNode;
    }
    // // 新节点的前驱指向头结点
    newNode->prior = head;
    // // 头结点的后驱指向新节点
    head->next = newNode;

    return 0;
}
// 尾插
int list_tail_insert(LinkList H, Data_type value)
{
    LinkList head = H;
    LinkList node = (LinkList)malloc(sizeof(LNode));
    if (node == NULL)
    {
        printf("内存分配失败\n");
        return -1;
    }
    node->data = value;
    node->next = NULL;

    while (head->next)
    {
        head = head->next;
    }
    node->prior = head;
    head->next = node;
}
// 根据位置查找
LinkList list_pos(LinkList H, int pos)
{
    if (H == NULL)
    {
        printf("链表为空\n");
        return NULL;
    }
    if (pos <= 0)
    {
        printf("位置错误\n");
        return NULL;
    }
    LinkList head = H;
    int i = 0;
    while (head->next != NULL)
    {
        if (i == pos)
        {
            break;
        }
        head = head->next;
        i++;
    }
    return head;
}
// 指定位置插入
int list_insert(LinkList H, Data_type value, int pos)
{
    LinkList newNode = (LinkList)malloc(sizeof(LNode));
    if (newNode == NULL)
    {
        printf("分配内存失败\n");
        return -1;
    }
    newNode->data = value;
    LinkList posNode = list_pos(H, pos);
    if (posNode == NULL)
    {
        printf("查找失败\n");
        return -1;
    }
    // printf("%d,%d,%d\n", posNode->data, pos, newNode->data);
    // // 插入的节点后继指向pos位置的节点
    newNode->next = posNode;
    // // 插入节点的前驱指向pos位置的前一个节点
    newNode->prior = posNode->prior;
    // pos节点的上一个节点的后驱指向插入的节点
    posNode->prior->next = newNode;
    // pos节点的前驱指
    posNode->prior = newNode;
    return 0;
}
// 销毁链表
LinkList list_free(LinkList H)
{
    LinkList p = H->next;
    LinkList q = NULL;
    while (p)
    {
        q = p->next;
        free(p);
        p = q;
    }
}
// 删除某一个位置上的结点
int list_delete(LinkList H, int pos)
{
    if (H == NULL)
    {
        printf("链表为空\n");
        return -1;
    }
    if (pos <= 0)
    {
        printf("位置错误\n");
        return -1;
    }
    LinkList head = H;
    int i = 0;
    while (head)
    {
        if (i == pos)
        {
            head->prior->next = head->next;
            head->next->prior = head->prior;
            free(head);
            break;
        }
        head = head->next;
        i++;
    }
}
// 遍历  双向链表
int list_show(LinkList H)
{
    LinkList p = H->next;
    while (p)
    {
        printf("%d-%p\t", p->data, p);
        p = p->next;
    }
    printf("\n");
}
void main()
{
    LinkList H = list_Create();
    list_head_insert(H, 1);
    list_head_insert(H, 2);
    list_head_insert(H, 3);
    list_head_insert(H, 4);
    list_head_insert(H, 5);
    list_head_insert(H, 6);
    // list_show(H);
    // list_tail_insert(H, 1);
    // list_tail_insert(H, 2);
    // list_tail_insert(H, 3);
    // list_tail_insert(H, 4);
    // list_tail_insert(H, 5);
    // list_tail_insert(H, 6);
    // list_show(H);
    // LinkList data = list_get(H, 4);
    // printf("%d\n", data->data);
    // list_show(H);
    // list_get(H, 2);
    // list_free(H);
    list_insert(H, 66, 3);
    list_show(H);
    list_delete(H, 3);
    list_show(H);
}